{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from dotenv import load_dotenv\n",
    "\n",
    "\n",
    "load_dotenv()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "\n",
    "llm = ChatOpenAI(model=\"qwen-max\", temperature=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 可复用的字符串提示模板"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提示:\n",
      "对光合作用做出简要说明。\n",
      "\n",
      "==================================================\n",
      "\n",
      "回复:\n",
      "光合作用是植物、某些细菌以及藻类利用阳光将二氧化碳和水转化成有机物质（如葡萄糖）和氧气的过程。这一过程不仅对执行光合作用的生物体本身至关重要，也是地球上大多数生命形式能量流动的基础。光合作用可以分为两个主要阶段：光反应和暗反应（也称作Calvin循环）。\n",
      "\n",
      "1. **光反应**：这个阶段发生在叶绿体的类囊体膜上，需要光照才能进行。在光的作用下，水分子被分解成氧气、电子和质子。产生的电子通过一系列载体传递，在此过程中产生ATP（腺苷三磷酸）和NADPH这两种能量载体。氧气作为副产品释放到空气中。\n",
      "   \n",
      "2. **暗反应/Calvin循环**：虽然被称为“暗”反应，但实际上它并不一定需要在黑暗中进行；只是相对于光反应来说，这部分过程不直接依赖于光。在这个阶段，植物使用由光反应生成的ATP和NADPH作为能量来源，将二氧化碳固定并转化为葡萄糖等有机物。这一步骤是在叶绿体的基质中完成的。\n",
      "\n",
      "总之，通过光合作用，植物能够制造自己所需的养分，并为地球上的其他生物提供了氧气，同时减少了大气中的二氧化碳含量，对于维持生态平衡具有极其重要的作用。\n"
     ]
    }
   ],
   "source": [
    "from langchain_core.prompts import PromptTemplate\n",
    "\n",
    "\n",
    "# Simple template with one variable\n",
    "simple_template = PromptTemplate(\n",
    "    template=\"对{topic}做出简要说明。\", input_variables=[\"topic\"]\n",
    ")\n",
    "\n",
    "\n",
    "prompt = simple_template.format(topic=\"光合作用\")\n",
    "response = llm.invoke(prompt)\n",
    "\n",
    "print(f\"提示:\\n{prompt}\")\n",
    "print(\"\\n\" + \"=\" * 50 + \"\\n\")\n",
    "print(f\"回复:\\n{response.content}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提示:\n",
      "简明扼要地向初学者受众解释人工智能领域中的神经网络概念。\n",
      "\n",
      "==================================================\n",
      "\n",
      "回复:\n",
      "神经网络是一种模仿人脑结构和功能的计算模型，用于处理复杂的信息。想象一下，我们的大脑是由许多相互连接的神经元组成的，这些神经元通过发送信号来交流信息。类似地，神经网络由大量的人工“神经元”组成，这些人工神经元按照层次排列，并且能够接收输入、处理数据并通过输出层给出结果。\n",
      "\n",
      "在最简单的形式中，一个神经网络包含三层：输入层（接受外部信息）、隐藏层（处理信息）以及输出层（产生最终结果）。当给定一些输入时，比如图片或声音文件，网络会尝试识别出其中的模式，并基于训练过程中学到的知识做出预测或分类。例如，它可以被用来识别照片中的物体是什么，或者理解一段语音的内容。\n",
      "\n",
      "随着技术的发展，人们开发出了更复杂的神经网络架构，如深度学习模型，它们拥有更多的隐藏层，能够自动提取更高层次的特征，从而实现更加准确的数据分析与决策支持。简而言之，神经网络就是一种让计算机从数据中学习并作出智能决策的技术手段。\n"
     ]
    }
   ],
   "source": [
    "# More complex template with multiple variables\n",
    "complex_template = PromptTemplate(\n",
    "    template=\"简明扼要地向{audience}受众解释{field}领域中的{concept}概念。\",\n",
    "    input_variables=[\"concept\", \"field\", \"audience\"],\n",
    ")\n",
    "\n",
    "prompt = complex_template.format(\n",
    "    concept=\"神经网络\", field=\"人工智能\", audience=\"初学者\"\n",
    ")\n",
    "response = llm.invoke(prompt)\n",
    "\n",
    "print(f\"提示:\\n{prompt}\")\n",
    "print(\"\\n\" + \"=\" * 50 + \"\\n\")\n",
    "print(f\"回复:\\n{response.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# JinJa2 条件变量提示模板"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from jinja2 import Template\n",
    "\n",
    "\n",
    "class Jinja2PromptTemplate:\n",
    "    \"\"\"A class to represent a template for generating prompts with variables\n",
    "    Attributes:\n",
    "        template (str): The template string with variables\n",
    "        input_variables (list): A list of the variable names in the template\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, template, input_variables):\n",
    "        self.template = Template(template)\n",
    "        self.input_variables = input_variables\n",
    "\n",
    "    def format(self, **kwargs):\n",
    "        return self.template.render(**kwargs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提示:\n",
      "我叫 李明，今年 35 岁。我现在的职业是软件开发工程师. 你能根据这些信息给我一些职业建议吗？请简明扼要地回答。\n",
      "\n",
      "==================================================\n",
      "\n",
      "回复:\n",
      "李明，作为一名35岁的软件开发工程师，你可以考虑以下几个方向来进一步发展你的职业生涯：\n",
      "\n",
      "1. **技术专精**：选择一个特定的技术领域深入研究，比如云计算、人工智能或大数据处理等，成为该领域的专家。\n",
      "2. **管理路径**：如果对团队管理和项目指导感兴趣，可以尝试向项目经理或者技术经理的方向转型。\n",
      "3. **创业之路**：结合自己的技术和行业经验，探索创办自己的科技公司或者加入初创企业担任核心技术岗位。\n",
      "4. **持续学习**：保持对新技术的好奇心和学习态度，通过在线课程、研讨会等方式不断充实自己。\n",
      "\n",
      "同时，也要注意平衡工作与生活的关系，保证良好的身心健康状态。希望这些建议对你有所帮助！\n"
     ]
    }
   ],
   "source": [
    "# Template with conditional content\n",
    "conditional_template = Jinja2PromptTemplate(\n",
    "    template=\"我叫 {{ name }}，今年 {{ age }} 岁。\"\n",
    "    \"{% if profession %}我现在的职业是{{ profession }}.{% else %}我现在还没有工作.{% endif %} \"\n",
    "    \"你能根据这些信息给我一些职业建议吗？请简明扼要地回答。\",\n",
    "    input_variables=[\"name\", \"age\", \"profession\"],\n",
    ")\n",
    "\n",
    "prompt = conditional_template.format(name=\"李明\", age=\"35\", profession=\"软件开发工程师\")\n",
    "response = llm.invoke(prompt)\n",
    "\n",
    "print(f\"提示:\\n{prompt}\")\n",
    "print(\"\\n\" + \"=\" * 50 + \"\\n\")\n",
    "print(f\"回复:\\n{response.content}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提示:\n",
      "我叫 韩梅梅，今年 22 岁。我现在还没有工作. 你能根据这些信息给我一些职业建议吗？请简明扼要地回答。\n",
      "\n",
      "==================================================\n",
      "\n",
      "回复:\n",
      "韩梅梅，根据你提供的信息，这里有一些建议供参考：\n",
      "\n",
      "1. **自我探索**：首先明确自己的兴趣所在、擅长的领域以及价值观，这有助于找到适合的职业方向。\n",
      "2. **教育背景**：考虑你的专业或任何已完成的相关培训课程，利用这些知识和技能寻找相关领域的工作机会。\n",
      "3. **实习经历**：如果可能的话，找寻实习机会来积累工作经验，并借此了解不同行业的情况。\n",
      "4. **网络建设**：通过社交媒体平台如LinkedIn建立职业联系网，参加线上线下的行业交流活动，扩大人脉圈。\n",
      "5. **持续学习**：对于感兴趣但不太熟悉的领域，可以通过在线课程等方式继续深造，提高竞争力。\n",
      "\n",
      "希望这些建议对你有所帮助！如果有更具体的方向或者兴趣点，可以进一步探讨。\n"
     ]
    }
   ],
   "source": [
    "prompt = conditional_template.format(name=\"韩梅梅\", age=\"22\", profession=\"\")\n",
    "response = llm.invoke(prompt)\n",
    "\n",
    "print(f\"提示:\\n{prompt}\")\n",
    "print(\"\\n\" + \"=\" * 50 + \"\\n\")\n",
    "print(f\"回复:\\n{response.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 在提示模板中使用列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提示:\n",
      "将这些项目分门别类：苹果，香蕉，胡萝卜，锤子，螺丝刀，钳子，小说，教科书，杂志。提供类别以及每个类别中的项目。\n",
      "\n",
      "==================================================\n",
      "\n",
      "回复:\n",
      "根据提供的项目，可以将它们分为三大类：食品、工具和书籍。下面是具体的分类：\n",
      "\n",
      "1. **食品**\n",
      "   - 苹果\n",
      "   - 香蕉\n",
      "   - 胡萝卜\n",
      "\n",
      "2. **工具**\n",
      "   - 锤子\n",
      "   - 螺丝刀\n",
      "   - 钳子\n",
      "\n",
      "3. **书籍**\n",
      "   - 小说\n",
      "   - 教科书\n",
      "   - 杂志\n",
      "\n",
      "这样的分类基于物品的主要用途或性质，即食用的归为食品，用于修理或制造等工作的归为工具，而用来阅读学习的内容则被归类为书籍。\n"
     ]
    }
   ],
   "source": [
    "# Template for list processing\n",
    "list_template = PromptTemplate(\n",
    "    template=\"将这些项目分门别类：{items}。提供类别以及每个类别中的项目。\",\n",
    "    input_variables=[\"items\"],\n",
    ")\n",
    "\n",
    "prompt = list_template.format(\n",
    "    items=\"苹果，香蕉，胡萝卜，锤子，螺丝刀，钳子，小说，教科书，杂志\"\n",
    ")\n",
    "response = llm.invoke(prompt)\n",
    "\n",
    "print(f\"提示:\\n{prompt}\")\n",
    "print(\"\\n\" + \"=\" * 50 + \"\\n\")\n",
    "print(f\"回复:\\n{response.content}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提示:\n",
      "分析下面的项目列表：\n",
      "- Python\n",
      "- JavaScript\n",
      "- HTML\n",
      "- CSS\n",
      "- React\n",
      "- Django\n",
      "- Flask\n",
      "- Node.js\n",
      "\n",
      "请对该列表进行总结，并提出可能的模式或分类建议。\n",
      "\n",
      "==================================================\n",
      "\n",
      "回复:\n",
      "这个列表中包含了多种编程语言和技术框架，它们主要被用于Web开发的不同方面。我们可以根据这些技术的功能和使用场景将它们分为几类：\n",
      "\n",
      "1. **前端开发技术**：\n",
      "   - HTML (超文本标记语言)：用来创建网页结构的基础语言。\n",
      "   - CSS (层叠样式表)：用于描述HTML文档的呈现方式，控制网页布局与设计。\n",
      "   - JavaScript：一种广泛使用的脚本语言，常用于实现网页上的交互功能。\n",
      "   - React：一个由Facebook维护的JavaScript库，专门用来构建用户界面，特别适合于单页应用(SPA)。\n",
      "\n",
      "2. **后端开发技术/框架**：\n",
      "   - Python：一种高级编程语言，因其简洁清晰而广受欢迎。它不仅仅适用于Web开发，但在此上下文中主要用于后端服务。\n",
      "     - Django：基于Python的一个高级Web框架，鼓励快速开发并遵循DRY（Don't Repeat Yourself）原则。它提供了很多内置功能来帮助开发者处理常见的Web应用需求。\n",
      "     - Flask：同样是基于Python的轻量级Web应用框架。相比Django来说更加灵活简单，适合小型项目或需要高度定制化的场景。\n",
      "   - Node.js：允许运行在服务器端的JavaScript环境，利用非阻塞I/O模型使得它可以高效地处理大量并发连接。Node.js非常适合实时web应用程序如聊天应用等。\n",
      "\n",
      "3. **全栈开发能力**：\n",
      "   从上述分类可以看出，某些技术可以跨越前后端界限，比如JavaScript既可用于客户端也能够通过Node.js在服务器端执行任务；同样地，React虽然通常被认为是前端技术，但在一些架构下也可以配合Node.js等后端技术共同构建完整的Web解决方案。\n",
      "\n",
      "综上所述，该列表展示了构建现代Web应用所需的一系列关键技术。对于希望全面掌握Web开发的人来说，了解这些工具及其应用场景是非常有价值的。同时，根据项目的具体需求选择合适的技术组合也是非常重要的一步。例如，如果需要快速搭建一个功能丰富的网站，可能会倾向于选择Django；而对于更注重灵活性的小型项目，则可能更偏好Flask或者结合React+Node.js这样的组合。\n"
     ]
    }
   ],
   "source": [
    "# Template with formatted list\n",
    "list_format_template = Jinja2PromptTemplate(\n",
    "    template=\"分析下面的项目列表：\\n\"\n",
    "    \"{% for item in items.split(',') %}\"\n",
    "    \"- {{ item.strip() }}\\n\"\n",
    "    \"{% endfor %}\"\n",
    "    \"\\n请对该列表进行总结，并提出可能的模式或分类建议。\",\n",
    "    input_variables=[\"items\"],\n",
    ")\n",
    "\n",
    "\n",
    "# Using the formatted list template\n",
    "prompt = list_format_template.format(\n",
    "    items=\"Python, JavaScript, HTML, CSS, React, Django, Flask, Node.js\"\n",
    ")\n",
    "response = llm.invoke(prompt)\n",
    "\n",
    "print(f\"提示:\\n{prompt}\")\n",
    "print(\"\\n\" + \"=\" * 50 + \"\\n\")\n",
    "print(f\"回复:\\n{response.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# JinJa2 字符串提示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "提示:\n",
      "任务：为一家科技初创公司设计一个标志\n",
      "背景：这家初创公司专注于 AI 驱动的医疗健康解决方案。\n",
      "约束条件：必须使用蓝色和绿色，并且设计应足够简洁，以便在缩小时仍然易于识别。\n",
      "\n",
      "请提供一个解决方案，该方案需满足任务要求，考虑背景信息，并遵守约束条件。\n",
      "\n",
      "==================================================\n",
      "\n",
      "回复:\n",
      "为这家专注于AI驱动的医疗健康解决方案的初创公司设计标志时，我们可以结合其业务特点与指定的颜色要求来构思。下面是一个设计方案的概念描述：\n",
      "\n",
      "### 设计概念\n",
      "- **核心元素**：将人工智能（AI）和医疗健康的象征性符号融合在一起，旨在传达出通过智能技术改善人类健康的愿景。\n",
      "- **颜色选择**：主要采用蓝色（代表科技、信任与稳定）和绿色（象征生命、成长及自然），以此反映公司在利用先进科技促进健康领域发展的使命。\n",
      "\n",
      "### 具体设计方案\n",
      "1. **图形部分**：\n",
      "   - 中心图案由一个抽象化的心脏轮廓构成，代表着健康护理的核心价值；心脏内部巧妙地嵌入了一个简化版的人工智能图标（比如一个小机器人头像或电路板图案），用以强调AI技术的应用。\n",
      "   - 心脏周围环绕着一圈微小但清晰可见的数据点/节点，这些节点连接形成网络状结构，暗示了大数据分析在个性化医疗服务中的重要作用。\n",
      "   \n",
      "2. **色彩运用**：\n",
      "   - 主色调为深蓝至浅蓝渐变，从中心向外逐渐过渡到淡绿色，这样的颜色搭配不仅符合品牌定位，同时也给人一种清新、专业的感觉。\n",
      "   - 对于数据点/节点等细节处，则可以使用更加鲜明的对比色——如亮绿或天蓝，以便让整体图案更加生动活泼而不失焦点。\n",
      "\n",
      "3. **文字标识**：\n",
      "   - 在图形下方添加简洁明了的品牌名称，字体选择现代简约风格，保证即使是在较小尺寸下也能轻松阅读。\n",
      "   - 可考虑将“AI”两个字母稍微放大并加粗处理，突出公司的核心技术方向。\n",
      "\n",
      "### 特别提示\n",
      "- 确保整个logo的设计足够简单且具有辨识度，在不同大小的应用场景中都能保持良好的视觉效果。\n",
      "- 考虑到未来可能需要在各种媒介上使用该标志，建议同时准备黑白版本以及反白版本（即背景为黑色时使用的白色版本）以备不时之需。\n",
      "\n",
      "通过上述方式设计出来的标志既能够准确传达出这家初创企业的行业属性及其核心竞争力，又能很好地满足所给定的颜色限制条件。\n"
     ]
    }
   ],
   "source": [
    "# Template with dynamic instructions\n",
    "dynamic_instruction_template = Jinja2PromptTemplate(\n",
    "    template=\"任务：{{ task }}\\n\"\n",
    "    \"背景：{{ context }}\\n\"\n",
    "    \"约束条件：{{ constraints }}\\n\\n\"\n",
    "    \"请提供一个解决方案，该方案需满足任务要求，考虑背景信息，并遵守约束条件。\",\n",
    "    input_variables=[\"task\", \"context\", \"constraints\"],\n",
    ")\n",
    "\n",
    "prompt = dynamic_instruction_template.format(\n",
    "    task=\"为一家科技初创公司设计一个标志\",\n",
    "    context=\"这家初创公司专注于 AI 驱动的医疗健康解决方案。\",\n",
    "    constraints=\"必须使用蓝色和绿色，并且设计应足够简洁，以便在缩小时仍然易于识别。\",\n",
    ")\n",
    "response = llm.invoke(prompt)\n",
    "\n",
    "print(f\"提示:\\n{prompt}\")\n",
    "print(\"\\n\" + \"=\" * 50 + \"\\n\")\n",
    "print(f\"回复:\\n{response.content}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "prompt",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
